package com.example.workflow.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

/**
 * 管理员统计接口数据访问层
 */
@Mapper
public interface AdminStatsMapper {
    /**
     * 按日统计指定日期范围内系统整体的工单数量
     * URL: /admin/total-count
     * 
     * @param beginDate 开始日期
     * @param endDate 结束日期
     * @return 按日统计的工单数量列表，包含日期和数量
     */
    List<Map<String, Object>> countSystemOrdersByDay(
        @Param("beginDate") LocalDate beginDate,
        @Param("endDate") LocalDate endDate
    );
    
    /**
     * 按周统计指定日期范围内系统整体的工单数量
     * URL: /admin/total-count
     * 
     * @param beginDate 开始日期
     * @param endDate 结束日期
     * @return 按周统计的工单数量列表，包含周起始日期和数量
     */
    List<Map<String, Object>> countSystemOrdersByWeek(
        @Param("beginDate") LocalDate beginDate,
        @Param("endDate") LocalDate endDate
    );
    
    /**
     * 按月统计指定日期范围内系统整体的工单数量
     * URL: /admin/total-count
     * 
     * @param beginDate 开始日期
     * @param endDate 结束日期
     * @return 按月统计的工单数量列表，包含月份和数量
     */
    List<Map<String, Object>> countSystemOrdersByMonth(
        @Param("beginDate") LocalDate beginDate,
        @Param("endDate") LocalDate endDate
    );
    
    /**
     * 统计系统所有工单各状态数量
     * URL: /admin/status-count
     * 
     * @return 各状态的工单数量
     */
    Map<String, Object> countSystemOrdersByStatus();
    
    /**
     * 统计系统所有工单各类型数量
     * URL: /admin/type-count
     * 
     * @return 各类型的工单数量
     */
    Map<String, Object> countSystemOrdersByType();
    
    /**
     * 按时间段统计完成的工单数量
     * 
     * @param beginDate 开始日期
     * @param endDate 结束日期
     * @param gap 时间间隔(day/week/month)
     * @return 时间点和对应的完成工单数量
     */
    List<Map<String, Object>> countCompletedOrdersByTimeRange(
            @Param("beginDate") String beginDate, 
            @Param("endDate") String endDate, 
            @Param("gap") String gap);
            
    /**
     * 按时间段统计驳回的工单数量
     * 
     * @param beginDate 开始日期
     * @param endDate 结束日期
     * @param gap 时间间隔(day/week/month)
     * @return 时间点和对应的驳回工单数量
     */
    List<Map<String, Object>> countRejectedOrdersByTimeRange(
            @Param("beginDate") String beginDate, 
            @Param("endDate") String endDate, 
            @Param("gap") String gap);
}
